#coding=utf-8
import os
import logging
import chardet
from gensim import corpora, models
import jieba
import jieba.posseg as pseg

def get_each_filepath(dirpath='.'):
    for _dir in os.listdir(dirpath):
        dir_path = './' + _dir
        if os.path.isdir(dir_path):
            for _file in os.listdir(dir_path):
                file_path = dir_path + '/' + _file
                yield file_path

class CutWord:

    def __init__(self, path='../lda/stopwords.txt'):
        self.stopwords = self.load_stopwords(path)

    def load_stopwords(self, path):
        stopwords_set = set()
        f = open(path, "r")
        content = f.read()
        f.close()
        for line in content.decode("utf-8").split('\n'):
            stopwords_set.add(line)
        return stopwords_set

    def cutWord(self, content):
        word_list = list()
        words = pseg.cut(content)
        for w in words:
            if (w.flag!="x" and w.flag!="uj" and w.flag!="c" and w.flag!="p"):
                if (w.flag!="u" and w.flag!="m" and w.flag!="r" and w.flag!="d"):
                    if (w.flag!="y" and w.flag!="e" and w.flag!="h" and w.flag!="k"):
                        if (w.flag!="ul" and w.flag!="uz" and w.flag!="f" and w.flag!="eng"):
                            if w.word not in self.stopwords:
                                word_list.append(w.word)
        return word_list


class MyGensimCreator:

    def __init__(self, dpath='../lda/deerwester.dict', cpath='../lda/deerwester.mm'):
        self.dict_path = dpath
        self.corpus_path = cpath
        self.cutword = CutWord()
        logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

    def get_texts(self):
        for file_path in get_each_filepath():
            f = open(file_path, "r")
            content = f.read()
            f.close()
            yield self.cutword.cutWord(content)

    def create_dictionary(self):
        dictionary = corpora.Dictionary(self.get_texts())
        dictionary.save(self.dict_path)
        return dictionary

    def create_corpus(self, dictionary):
        corpus = [dictionary.doc2bow(text) for text in self.get_texts()]
        corpora.MmCorpus.serialize(self.corpus_path, corpus)
        return corpus

class MyGensim(MyGensimCreator):

    def __init__(self, dpath='../lda/deerwester.dict', cpath='../lda/deerwester.mm'):
        MyGensimCreator.__init__(self, dpath, cpath)
        self.corpus = self.get_corpus()
        self.dictionary = self.get_dictionary()

    def get_corpus(self):
        try:
            corpus = corpora.MmCorpus(self.corpus_path)
        except Exception:
            corpus = self.create_corpus(self.get_dictionary())
        return corpus

    def get_dictionary(self):
        try:
            dictionary = corpora.Dictionary.load(self.dict_path)
        except Exception:
            dictionary = self.create_dictionary()
        return dictionary

    def tfidf_transformation(self):
        tfidf = models.TfidfModel(self.corpus)
        return tfidf

    def lda_transformation(self, num_of_topics=100):
        lda = models.ldamodel.LdaModel(self.corpus, id2word=self.dictionary, num_topics=num_of_topics)
        return lda
        
    def lda_multicore_transformation(self, num_of_topics=100, workers=3):
        lda = models.ldamulticore.LdaMulticore(self.corpus, id2word=self.dictionary, num_topics=num_of_topics, workers=workers)
        return lda
        
    def lsi_transformation(self, num_of_topics):
        corpus_tfidf = self.tfidf_transformation()
        lsi = models.LsiModel(corpus_tfidf, id2word=self.dictionary, num_topics=num_of_topics)
        return lsi

    def save_lda_model(self, lda, path='../lda/model.lda'):
        lda.save(path)

    def get_ldamodel(self, path='../lda/model.lda'):
        try:
            lda = models.LdaModel.load(path)
        except Exception:
            lda = self.lda_transformation(num_of_topics=300)
        return lda
        
    def save_ldi_model(self, lsi, path='../lda/model.lsi'):
        lsi.save(path)

    def get_lsimodel(self, path='../lda/model.lsi'):
        try:
            lsi = models.LsiModel.load(path)
        except Exception:
            lsi = self.lsi_transformation(num_of_topics=100)
        return lsi

    def doc2bow(self, content):
        doc = self.cutword.cutWord(content)
        return self.dictionary.doc2bow(doc)


def print_dictionary(dictionary):
    mydict = dictionary.token2id
    mydict = sorted(mydict.items(), key=lambda item: item[1], reverse=False)
    for word, id in mydict:
        if id < 10000:
            print word + ": " + str(id)

if __name__ == "__main__":
    doc = u"""昨天，魅族科技宣称获得阿里巴巴集团联合海通开元基金共计6.5亿美元的战略投资，虽然去年七月也传出过阿里注资魅族的消息，但这次是魅族第一次承认真正引入战略投资。

　　魅族没钱才被收的？
eval_every
　　答案是：是的。如果不缺钱，依黄章一贯“不喜欢就滚”的性格，是不可能向随随便便资本方投降的，是不可能有搭载MTK平台的MX4这种降逼格的产品出来，也不可能推出999元的魅蓝低端产品，更不可能在付给代工厂的钱都是抠了又抠的情况下还拿出近千万的费用来做四场发布会的豪气，一句话，有了钱就喜欢任性。

　　但这种任性也是有代价的，首先就是改变其旧有的产品策略，不再局限小众市场做高精尖的产品，而且借低价位产品快速打入市场，扩大市场份额，例如魅蓝的产品，做工保持魅族系列一贯的精致，但是软件问题造成用户投诉颇多，这跟原来的黄章的策略是严重背离的，像这样的产品以前是不可能上市的，所以现在很多人怀疑黄章已经失去对公司的完全控制也不是空穴来风。

　　做全产业链一直是阿里的梦想？

　　答案是：是的。做手机不是阿里的目标，阿里的理想是打造一个以手机硬件为载体的闭环产业链，当初在立项时考虑到硬件的生产及销售困难，所以才从OS层面进行切入，通过培养用户习惯，整合内部的APP集群，然后实现向下游硬件产业端的延伸。

　　当初阿里云OS在2.0版本推广时，其负责人就吼出了“先投10亿人民币，不行就换成美元的”豪言壮语，但是从与其合作的众多厂商看，结局都比较悲催，从尼凯恩到波导到卓普到HIKE，基本上现在都销声匿迹，在市场上也没有掀起太大的波澜，而阿里云OS改良策略也被谷歌警告一次，封闭ADB进程造成不兼容第三方助手软件无法使用也让众多用户抱怨产品体验差而怨声再道……

　　从这些可以看出来，阿里一直在尝试着从硬件、OS、APP、用户等多方面进行融合，打造一个完整的产业链闭环，这就是阿里帝国的梦想。

　　为什么不是大神？

　　答案很简单：因为360已经抢先投了。作为3BAT阵营中的一员，360这次布局大神，实际上也是从当前的移动互联网竞争态势中看出来了端倪，如果不抢先布局硬件平台，像乐安全、i管家、酷管家这样的厂商本身的安全软件就会侵蚀其主打产品360卫士的生存空间，到时候360手机卫士的市场空间就会受到压缩，而且现在的手机安全威胁更趋向于底层硬件层面上的防护，也这是360必须联姻硬件厂商获取一个深度合作平台的原因。

　　而大神因为被360切入，最直接的后果就是被腾讯取消QQ空间的合作，就算是给再多的赔偿也要取消合作，接下来阿里也是把大神从天猫的VIP级战略合作伙伴降为了普通级别，谁都不想“用自己的奶水养大的品牌原来是隔壁对门爱唠叨的周家的骨肉”，这就是现在3BAT阵营的实情，真的到了你死我活，难容对手的地步，这也就是阿里为什么现在必须要尽快找到一家硬件平台落地的原因一样，因为百度投了联想的电商品牌神奇工场、360布局了大神，阿里再不积极点就真的晚了！

　　小米为啥不卖给阿里

　　有人肯定说，市值第一的阿里配国产第一的小米是良配，这其实有点偏见。以小米的消费者群体特点来看，最适合的反而是腾讯，大家都是针对屌丝的。那为什么阿里与小米难配成功了？我们觉得有几点，最关键一点就是没有郎情妾情的基础。

　　首先小米现在不缺钱，目前小米的估值是450亿美元，现金流也充裕，产销两旺，对投资的渴望并不明显，或者说看好小米的太多，愿意投钱也太多，阿里没有充足的条件打动它。

　　第二就是小米正在构建基于APP独立平台控制的“三屏一端”智能家居产业链，从小米的这几次融资来看，包括智能插座、智能摄像头、智能灯泡等大量的智能家居周边设备厂商的加入，小米打造的智能家居生态链雏形已经形成，而且据雷军自己说，传统家电加装智能控制芯片的成本也将降为10几块人民币，从这一系列看出来，小米要做的事野心很大，而且跟阿里的APP集群有一定冲突，所以两者没有“爱情基础”也是必然。

　　第三就是小米的盘子太大，依阿里这笔投资估计连个水都听不到，而投到魅族可以占到相当的股份，有相当的话语权，也这是阿里的一个出发点吧，必竟阿里云OS是阿里所有战略的入口平台，没有这个，一切都是白搭！"""
    mygensim = MyGensim()
    lda = mygensim.get_ldamodel()
    mygensim.save_lda_model(lda)
    lda.print_topics(300)
    new_vec = mygensim.doc2bow(doc)
    #print new_vec
    #print len(new_vec)
    print lda[new_vec]
    sum = 0.0
    for topic, p in lda[new_vec]:
        sum += p
    print sum
    #dictionary = mygensim.get_dictionary()
    #print_dictionary(dictionary)
